﻿/**
 * @file txr_algo_dlm_cls_v2_o.cpp
 * @brief 分类模型V2版本的实现文件
 * 
 * 本文件包含以下主要内容:
 * 1. MODEL_SUFFIX宏定义 - 定义了模型文件的后缀名为".ocls2"
 * 2. TxrAlgoDlmClsV2_o类 - 分类模型V2版本的具体实现类
 *    - 继承自TxrAlgoDlmClsImpl基类
 *    - 实现了模型加载、释放、批处理大小获取和检测等功能
 *    - 内部封装了InferClsV2类进行实际的推理操作
 */


#include "txr_algo_dlm_cls_v2_o.h"
#include "infer_cls_v2_o.h"

/**
 * @brief 定义模型文件后缀名
 */
#define MODEL_SUFFIX ".ocls2"

namespace txr_algo_dlm_cls
{
	/**
	 * @brief 构造函数
	 * @details 初始化推理器指针为空
	 */
	TxrAlgoDlmClsV2_o::TxrAlgoDlmClsV2_o()
		:m_p_infer(TK_NULL_PTR){
	}

	/**
	 * @brief 析构函数
	 * @details 释放资源
	 */
	TxrAlgoDlmClsV2_o::~TxrAlgoDlmClsV2_o(){
		Release();
	}

	/**
	 * @brief 加载分类模型
	 * @param cfg 模型配置信息
	 * @return 加载是否成功
	 */
	tk_bool TxrAlgoDlmClsV2_o::Load(st_dlm_cfg& cfg)
	{
		Release();
		m_p_infer = new InferClsV2();

		std::string path_weight = std::string(cfg.file_path_name) + MODEL_SUFFIX;

		return m_p_infer->Init(cfg.gpu_id, path_weight.c_str());
	}

	/**
	 * @brief 释放资源
	 * @details 释放推理器对象
	 */
	void TxrAlgoDlmClsV2_o::Release()
	{
		SAFE_DELETE(m_p_infer);
	}

	/**
	 * @brief 获取批处理大小
	 * @return 返回模型支持的批处理大小
	 */
	tk_int32 TxrAlgoDlmClsV2_o::BatchSize()
	{
		return m_p_infer->BatchSize();
	}

	/**
	 * @brief 执行图像分类检测
	 * @param p_unit 检测单元数组
	 * @param size 数组大小
	 */
	void TxrAlgoDlmClsV2_o::Detect(st_detect_unit* p_unit, tk_int32 size)
	{
		if (!size || !m_p_infer)
		{
			return;
		}
		for (tk_int32 i = 0; i < size; ++i)
		{
			st_img_rgb& rgb = p_unit[i].img;
			if (!
				((rgb.pp_rgb8[0] && rgb.pp_rgb8[1] && rgb.pp_rgb8[2]) ||
					(rgb.pp_rgb16[0] && rgb.pp_rgb16[1] && rgb.pp_rgb16[2]) ||
					(rgb.pp_rgbf[0] && rgb.pp_rgbf[1] && rgb.pp_rgbf[2]))
				)
			{
				Q_ASSERT(0);
				return;
			}
		}

		m_p_infer->Detect(p_unit, size);
	}
	//===========================================
	extern "C" TXR_ALGO_DLM_CLS_V2_O_EXPORT TxrAlgoDlmClsImpl * CreateDlmClsObj();
	extern "C" TXR_ALGO_DLM_CLS_V2_O_EXPORT void DeleteDlmClsObj(TxrAlgoDlmClsImpl * p);

	/**
	 * @brief 创建分类模型对象
	 * @return 返回新创建的TxrAlgoDlmClsV2_o对象指针
	 */
	TxrAlgoDlmClsImpl* CreateDlmClsObj()
	{
		return new TxrAlgoDlmClsV2_o();
	}

	/**
	 * @brief 删除分类模型对象
	 * @param p 要删除的对象指针
	 */
	void DeleteDlmClsObj(TxrAlgoDlmClsImpl* p)
	{
		SAFE_DELETE(p);
	}
}//namespace txr_algo_dlm